從最初練習製作的小程式中,觀察最後完成時的程式碼,應該已經有人開始覺得好像有點亂,要編輯部份物件已經開始要使用搜尋功能查找他們的位置了是吧。那麼,一個擁有著完整功能的應用程式,或應該說一個中小型規模的程式,如果要將所有程式碼都塞在main.dart中,肯定會變得很亂,且難以維護。
若有瀏覽過其他人所寫的程式,肯定會發現他們許多程式碼都會放在其他的文件夾中,且那些文件夾通常不是隨便命名的,他們其實有著一個極具邏輯性且被完整規劃過得結構與名稱。今天,筆者想帶著大家一起研究開發時該如何做文件分類,以為將來的程式做規劃整理。
通常,我們都會希望我們的資料夾的邏輯結構清晰,其他人看一眼就能大致猜到裡面的檔案類型,因此,命名的方式就非常重要。幸運的是,我們不必去煩惱文件夾該如何命名,現在已經有被廣泛使用的一套模式,我們只需要去學習他們就可以啦。
這個資料夾內的東西比較是與程式碼沒有直接關聯,而是應用程式所需要用到的其他資料,像是圖示,或是一些其他檔案類型。在flutter中,若想在程式中增加Icon與Logo,也是將他們放入assets資料夾(很可能須自行建立一個),之後再於pubspec.yaml中將他們加入應用程式之中。
詳細說明請點此。
myProject
├── /assets
│ ├── /icons
│ │ ├── /brands
│ │ ├── /categories
│ │ └── /payment_methods
│ ├── /images
│ └── /logos
│ └── ...
└── /fonts
│ └── ...
└── /lib
└── ...
這應該很容易理解,此資料夾內包含著程式所需要的自訂字體。建立一個在專案root的fonts
資料夾,將字體檔案移入,並於pubspec.yaml做設定,便可以新增可用字體。
詳細說明請點此。
這個就是我們要編輯的程式碼所在位置。在我們新建立的flutter專案中,不是也會自動將main.dart建立在lib的資料夾內嗎。除了main.dart,其他會用到的程式檔案都將放在這裡。
這個資料夾內用於放source file,也就是main.dart會使用到的內容。對於內容較多的應用程式,src/內還會有其他的資料夾,以下為一種資料夾結構:
lib/
├── main.dart
└── src/
├── controllers/
├── routes/
├── models/
├── services/
├── themes/
├── utils/
├── views/
└── widgets/
以下也是一個實用的分類方式,不是將東西都放入src/中,而是在lib/先分成4大類(不包含routes/ services/),再進一步細分。
lib/
├── main.dart
├── core/
│ ├── config/
│ ├── constants/
│ ├── utils/
│ └── errors/
├── data/
│ ├── models/
│ ├── repositories/
│ └── providers/
├── domain/
│ ├── entities/
│ ├── usecases/
│ └── repositories/
├── presentation/
│ ├── pages/
│ ├── widgets/
│ ├── blocs/ (or cubits/ for Bloc package users)
│ └── controllers/ (for MVC pattern or GetX)
└── routes/
└── services/
有些大型程式中,每個功能各自擁有一大堆的程式碼,那麼,上面的分類方式就會不夠用了。因此,這時候我們將先依照功能feature分類,再將與那功能相關的程式碼放入該資料夾中。這種分類方式稱作feature-first,與之相對的則是layer-first。
lib/
├── features/
│ ├── authentication/
│ │ ├── data/
│ │ ├── domain/
│ │ └── presentation/
│ └── home/
│ ├── data/
│ ├── domain/
│ └── presentation/
├── core/
└── routes/
lib/
├── feature_1/
│ ├── screens/
│ ├── widgets/
│ ├── models/
│ ├── services/
│ └── view_models/
├── feature_2/
│ ├── screens/
│ ├── widgets/
│ ├── models/
│ ├── services/
│ └── view_models/
└── ...
其實,資料夾結構沒有一個既定的格式,重點僅在於讓程式好維護與編輯。在團隊專案中,有著一致的結構規則也有助於保持程式簡潔不雜亂。而其中,大多數採用的分類方式都有著一個主要重點,便是小程式->layer-first,大專案->feature-first。
有任何問題或是想說的,都歡迎留言或email。謝謝看到這裡的讀者,明天會繼續加油更新的!
p.s. 想快速讓自己的資料夾結構以上方的樹狀圖印出,可於自己電腦中的package manager中下載tree
,順帶一題,筆者平常用的是eza-community/eza,一個快速且可美化tree跟ls的小工具。
以下為本文的參考文章: